#ifndef __BSP_H__
#define __BSP_H__

int hal_set_time(char *pTime);
int hal_crop_zoom(int offsetx, int offsety, float wflag, float hflag, unsigned int xx);
int hal_cross_update(int onoff, int cross_type, int cross_color, int offsetx, int offsety);

int devmem_read(unsigned long addr, unsigned long *pVal);
int devmem_write(unsigned long addr, unsigned long writeval);

/**************************************************************
*   保存参数到flash中，掉电保存
*   pName: 参数名称
*   pVal:  参数值(数字等都转成字符串存储)
*   out :  成功返回0，不成功返回小于0
*
*      注意: pName如果flash中存在，pval会覆盖原值   
*            pName如果flash中不存在，则会新建一个值
*            pName长度不超过64字节 
*/
int save_paramemter_to_flash(const char *pName, char *pVal);

/**************************************************************
*   从flash中加载OEM参数
*   pName: 参数名称
*   pVal:  返回参数buffer起始指针
*   buflen: 返回buffer长度，保证大于64
*   out :  成功返回获取的pval长度值，不成功返回小于0
*
*      注意: pName如果flash中存在，返回成功，参数值在pval中
*            pName如果flash中不存在，返回失败
*/
int load_paramemter_from_flash(const char *pName, char *pVal, unsigned int buflen);

/*************************************
*   真正将参数写入flash
*   调用次数不宜频繁,否则严重影响系统性能
*   建议:关机时调用一次或者退出菜单时调用一次就好
*/
int save_paramemters(void);

/*************************************
*   清空所有参数
*   调用次数不宜频繁,严重影响系统性能
*   清空UI参数, GUI部分做恢复出厂设置，应当优先使用。
*   清空WiFi 参数
*   不会格式化SDcard
*   不会执行重启
*/
int clear_paramemters(void);

/**************************************************************
*   从flash中加载OEM参数
*   pName: 参数名称
*   pVal:  返回参数值bffer(保证长度大于64)
*   out :  成功返回0，不成功返回小于0
*
*      注意: pName如果flash中存在，返回成功，参数值在pval中
*            pName如果flash中不存在，返回失败
*
*    为了保持和http api接口一致，固定约定的值有:
*    
*    OEM_FPGA_VER          setFpgaver
*    OEM_HW_VER            setHwver
*    OEM_SW_VER            setAppver
*    OEM_PRODUCT_NUM       setPN
*    OEM_SERIL_NUM         setSN
*    OEM_MODEL_NAME        setModelname
*    OEM_RPODUCE_DATE      setProductdate
*    OEM_PREFIX_SSID       setPrefixSSID
*
*    当然UI程序可以自由写入其他字段参数。
*/
int load_oeminfo_from_flash(const char *pName, char *pVal, unsigned int buflen);

/**************************************************************
*   读取fw系统版本号
*   pVal:  返回参数值bffer(保证长度大于64)
*   out :  成功返回0，不成功返回小于0
*
*/
int read_rootfs_version(char *pVal, unsigned int buflen);

/**************************************************************
*   读取bootloader版本号
*   pVal:  返回参数值bffer(保证长度大于64)
*   out :  成功返回0，不成功返回小于0
*/
int read_bootloader_version(char *pVal, unsigned int buflen);

/**************************************************************
*   暂存fpga版本号，供http api读取
*   pVersion:  输入参数(保证长度小于于64)
*/
int touch_fpga_version(const char *pVersion);

/**************************************************************
*   暂存gui版本号，供http api读取
*   pVersion:  输入参数(保证长度小于于64)
*/
int touch_gui_version(const char *pVersion);

/***********************************************************************
*
*   获取录像和拍照状态
*   pobj->devctx.rec.val
*   pobj->devctx.capture.val
*
***********************************************************************/
int Hal_get_stats(int *pRecval, int *pCapval, int *pADCval);

/***********************************************
*   eptz_msg_send2
*   控制图像无极变倍效果
*   pPtzTbl  point to a videoeptz_t arrary, max  arrary
*            size is 256/sizeof(videoeptz_t)  
***********************************************/
typedef struct
{
	float offsetx;
	float offsety;
	float fzoom; 		//放大面积的倒数 0.01 - 1.0
	unsigned int flag; 	//0: unvalid, > 0: valid, maybe use as index
} videoeptz_t;

/*************************************************
* 
*   eptz_msg_send2
*   控制图像无极变倍效果 
*   以1倍图像 正中心点 放大 fzoom 倍（面积倍率），再移动`方框`框选显示区域
*   
*   offsetx offsety `方框`框选区域移动范围
*   fzoom; //放大面积的倒数 0.01 - 1.0
*   flag; //0: unvalid, > 0: valid, maybe use as index
*
*   pPtzTbl 缩放开始指向的指针 经过 cnts 个 无极缩放后 到达 pPtzTbl+cnts指向的倍率
*   当 pPtzTbl+cnts指向的倍率 不存在 时 会抖动
*   数组 坐标只能正向增加 逆向时会抖动
*
*   ***********************************************/
int eptz_msg_send2(videoeptz_t *pPtzTbl,unsigned int cnts);

/*
    新功能pip显示位置 20230116

    pip显示的宽度和高度是固定的，所以不用传入    
    unsigned int dispx,
    unsigned int dispy,
    dispx，dispy，是指显示位置，相对于屏幕左上角(0,0)点的位置，注意值的范围，
    GUI程序自行限定，否则程序可能出现不可以预见的错误。

    如何控制PIP的显示与否:
    传入一个正确的值，将打开PIP显示。
    传入一个超限的disp位置值，将关闭PIP显示
    
    int offsetx,
    int offsety
    offsety,offsetx 是指输入图像相对于显示屏图像中心点的偏移值。

    此函数调用说明:
    特别需要注意值的范围，否则程序可能出现不可以预见的错误。
*/
int crop_pip_msg_send2(unsigned int dispx, unsigned int dispy, int offsetx, int offsety);

/*
	光标显示位置
	onoff 0: off   1: on
	y,u,v: cross draw color, yuv420 format
	...
	可能后续需要传中心点坐标进来
	cross center point(x,y)
*/
int cross_draw_msg_send(unsigned char onoff, int offsetx,int offsety, unsigned char y,unsigned char u, unsigned char v);

/*
 * wifi开关
 * input:  0:off, 1:on
 */
int hal_wifi_onoff(unsigned int onoff);

/*
 * mic开关
 * input:  0:enable, 1:disable
 */
int hal_micphone_mute(unsigned int enable);

/* time 视频显示冻结时间，ms (20-1000) */
int freezetime_msg_send(unsigned int time);

/* 透明串口功能开关 */
int hal_uart2serial_onoff(unsigned int onoff);

int hal_sdc_capture(unsigned int onoff);
int hal_sdc_record(unsigned int onoff);
int hal_sys_factoryset(void);
int hal_sdc_format(void);

// 以下接口只支持X210可见光设备
// 所有参数函数体内部没有判断是否有效。请下准确的参数值，以免出错
//
/*************************************************************
*  图像彩色和黑白莫模式切换
*  hal_cs_colormono
*  intput:  value [0:1]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_monomode(int enable);


/*************************************************************
*  图像彩色和黑白莫模式切换2
*  hal_cs_colormono2
*  intput:  value [0:1]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_monomode2(int enable);


/*************************************************************
*  曝光补偿
*  (range: 25~400, default: 100) (200 =+ 1EV, 50 =- 1EV)
*  intput:  value [25~400]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_ev(int value);



/*************************************************************
* 图像亮度调节，非LCD亮度
*  (range: 0~200, 100 =x 1, default: 100)
*  intput:  value [0~200]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_brightness(int value);



/*************************************************************
*  图像对比度调节
*  (range:.0~200, 100 =x 1, default: 100)
*  intput:  value [0~200]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_contrast(int value);



/*************************************************************
*  图像锐度
*  hal_cs_set_sharpness (range: 0~400, default: 100) (100 =x 1)
*  intput:  value [0~400]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_sharpness(int value);


/*************************************************************
*  饱和度调节
*  hal_cs_set_saturation (range: 0~200, 100 =x 1, default: 100)
*  intput:  value [0~200]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_saturation(int value);


/*************************************************************
*  色调调节
*  hal_cs_set_saturation (range: -360~360, default: 0)
*  intput:  value [-360~360]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_hue(int value);

/*************************************************************
*  去噪声模式设置
*  hal_cs_set_denoisemode (0: 2D only, 1: 3DNR and 2DNR on, default: 1)
*  intput:  value [0~1]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_denoisemode(int value);


/*************************************************************
*  2D去噪声强度设置
*  hal_cs_set_2Ddenoiselevel (range: 0~400, default: 100) (100 =x 1)
*  intput:  value [0~400]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_2Ddenoiselevel(int value);


/*************************************************************
*  3D去噪声强度设置
*  hal_cs_set_3ddenoiselevel (range: 0~400, default: 100) (100 =x 1)
*  intput:  value [0~400]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_3Ddenoiselevel(int value);


/*************************************************************
*  高亮强光抑制
*  hal_cs_set_highlightcompress
	High light compress mode has 4 parameters.
		1. High light compress mode.
		(0: Disable, 1: Enable, default: 0)
		2. High light compress auto/manual mode.
		(0: Auto, 1: Manual, default:1)
		3. High light compress mask mode.
		(0: Disable, 1: Enable, default:0)
		4. High light compress level.
		(range:10(strong)~100(weak), default: 90)
*  intput:
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_highlightcompress(int enable, int mode, int mask, int level);


/*************************************************************
*  去雾算法
*  hal_cs_set_defog
	Defog mode has 3 parameters.
	1. Defog mode.
	(0: Disable, 1: Enable, default: 0)
	2. Defog level.
	(range: 0~100, default: 24)
	3. Defog sensitivity.
	(range: 0~31, default: 10)
*  intput:
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_defog(int enable, int level, int sensitivity);


/*************************************************************
*  摄像模式和帧率调节
*  hal_cs_capmode
*  intput:  hwid:  0: 1G内存, 1: 2G内存;(根据硬件选择，目前版本没有生效)
*           fps:  当hwid为0时，帧率可以选择值为[25:30]
*           fps:  当hwid为1时，帧率可以选择值为[25:30:50:60]
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_capmode(unsigned int hwid, unsigned int fps);


/*************************************************************
*  设置快门时限范围，1000000表示1s，如果需要帧率是25fps，那么
*                  maxshutter = 1000000/25 = 40ms;
*								 如果需要帧率是50fps，那么
*                  maxshutter = 1000000/50 = 20ms;
*                  minshutter = sensor曝光1行 = 32us; 设置值要小于32us
*                  minshutter 请设置为默认固定值，不要变动
*  hal_cs_set_shutter
*  intput:  minshutter: (range: 1~1000000, default: 40000) (1000000 = 1sec)
*           maxshutter: (range: 1~1000000, default: 25) (1000000 = 1sec)
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_shutter(unsigned int minshutter, unsigned int maxshutter);


/*************************************************************
*  设置光信号增益，增益大，噪点多，需要取得均衡
*  hal_cs_set_adgain
*  intput:  minshutter:
*           maxshutter:
*  return -1: error
*          0: successful
**************************************************************/
int hal_cs_set_adgain(unsigned int mingain, unsigned int maxgain);



/*************************************************************
*  设置外部灯光频率（目前无效20210826）
*  hal_cs_set_powerline
*  intput:  freq:(50: 50 Hz, 60: 60Hz)
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_powerline(unsigned int freq);


/*************************************************************
*  设置AWB Mode
*  hal_cs_set_awb
*  mode:  0 for normal
          1 for nightfall
          2 for others
*  return -1: error
*          0: successful
**************************************************************/
int  hal_cs_set_awb(unsigned int awbmode);


/*************************************************************
*  sensor 休眠
*  hal_cs_set_suspend
*  intput:  dummy: 可以忽略
*
*  return -1: error/not support
*          0: successful
**************************************************************/
int  hal_cs_set_suspend(unsigned int dummy);


/*************************************************************
*  sensor 恢复正常工作
*  hal_cs_set_resume
*  intput:  dummy: 可以忽略
*
*  return -1: error/not support
*          0: successful
**************************************************************/
int  hal_cs_set_resume(unsigned int dummy);


/*************************************************************
*  sensor 休眠2
*  hal_cs_set_suspend2
*  intput:  dummy: 可以忽略
*
*  return  -1: error/not support
*          0: successful
**************************************************************/
int  hal_cs_set_suspend2(unsigned int dummy);


/*************************************************************
*  sensor 恢复正常工作2
*  hal_cs_set_resume2
*  intput:  dummy: 可以忽略
*
*  return  -1: error/not support
*          0: successful
**************************************************************/
int  hal_cs_set_resume2(unsigned int dummy);

#endif // !__BSP_H__